package br.usp.ime.ingpos.modelo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

/**
 * @author willen
 *
 */
@Entity
public class Curriculo
    implements
        Serializable
{

    private static final long serialVersionUID = 6231896863306406349L;

    @Id
    @GeneratedValue
    private Long curriculoID;

    @Column
    private String nomeArquivoDiploma;

    @Column
    private String nomeArquivoHistorico;

    @Column
    private String nomeArquivoPoscomp;
    
    @Column
    private String nomeArquivoHIstoricoMestrado;
    
    @Column
    private String nomeArquivoDiplomaMestrado;

    @Column( length = 1000 )
    private String experienciaProfissional;

    @Column( length = 1000 )
    private String atividadesAtuais;

    @Column( length = 1000 )
    private String resumoMestrado;

    @Embedded
    private PosComp posComp;


    @Column( name = "Historico" )
    @Lob( )
    @Cascade( {
        CascadeType.SAVE_UPDATE, CascadeType.DELETE
    } )
    private byte[] arquivoHistoricoPDF;

    @Column( name = "Diploma" )
    @Lob( )
    @Cascade( {
        CascadeType.SAVE_UPDATE, CascadeType.DELETE
    } )
    private byte[] arquivoDiplomaPDF;

    @Column( name = "ResultadoPOSCOMP" )
    @Lob( )
    @Cascade( {
        CascadeType.SAVE_UPDATE, CascadeType.DELETE
    } )
    private byte[] arquivoPoscompPDF;
    
    @Column( name = "DiplomaMestrado" )
    @Lob( )
    @Cascade( {
        CascadeType.SAVE_UPDATE, CascadeType.DELETE
    } )
    private byte[] arquivoDiplomaMestradoPDF;
    
    @Column( name = "HistoricoMestrado" )
    @Lob( )
    @Cascade( {
        CascadeType.SAVE_UPDATE, CascadeType.DELETE
    } )
    private byte[] arquivoHistoricoMestradoPDF;

    @OneToMany
    @Cascade( {
        CascadeType.ALL
    } )
    @JoinColumn( name = "curriculoID" )
    private Set<FormacaoAcademica> formacoesAcademicas;

    @OneToMany
    @Cascade( {
        CascadeType.ALL
    } )
    @JoinColumn( name = "curriculoID" )
    private Set<Bolsa> bolsas;

    @OneToMany
    @Cascade( {
        CascadeType.ALL
    } )
    @JoinColumn( name = "curriculoID" )
    private Set<IniciacaoCientifica> iniciacoesCientificas;

    @OneToMany
    @Cascade( {
        CascadeType.ALL
    } )
    @JoinColumn( name = "curriculoID" )
    private Set<DisciplinaEspecial> disciplinasEspeciais;

    public Curriculo()
    {
        this.formacoesAcademicas = new HashSet<FormacaoAcademica>();
        this.bolsas = new HashSet<Bolsa>();
        this.iniciacoesCientificas = new HashSet<IniciacaoCientifica>();
        this.disciplinasEspeciais = new HashSet<DisciplinaEspecial>();
    }

    public Set<IniciacaoCientifica> getIniciacoesCientificas()
    {
        return iniciacoesCientificas;
    }

    public void setIniciacoesCientificas(
        Set<IniciacaoCientifica> iniciacaoCientifica )
    {
        this.iniciacoesCientificas = iniciacaoCientifica;
    }

    public PosComp getPosComp()
    {
        return posComp;
    }

    public void setPosComp(
        PosComp posComp )
    {
        this.posComp = posComp;
    }

    public String getNomeArquivoHIstoricoMestrado()
    {
        return nomeArquivoHIstoricoMestrado;
    }

    public void setNomeArquivoHIstoricoMestrado(
        String nomeArquivoHIstoricoMestrado )
    {
        this.nomeArquivoHIstoricoMestrado = nomeArquivoHIstoricoMestrado;
    }

    public String getNomeArquivoDiplomaMestrado()
    {
        return nomeArquivoDiplomaMestrado;
    }

    public void setNomeArquivoDiplomaMestrado(
        String nomeArquivoDiplomaMestrado )
    {
        this.nomeArquivoDiplomaMestrado = nomeArquivoDiplomaMestrado;
    }
    
    public Long getCurriculoID()
    {
        return curriculoID;
    }

    public void setCurriculoID(
        Long curriculoID )
    {
        this.curriculoID = curriculoID;
    }

    public Set<FormacaoAcademica> getFormacoesAcademicas()
    {
        return formacoesAcademicas;
    }

    protected void setFormacoesAcademicas(
        Set<FormacaoAcademica> formacaoAcademica )
    {
        this.formacoesAcademicas = formacaoAcademica;
    }

    public Set<Bolsa> getBolsas()
    {
        return bolsas;
    }

    public void setBolsas(
        Set<Bolsa> bolsas )
    {
        this.bolsas = bolsas;
    }

    /**
     * Adiciona uma formação academica ao curriculo. Se ja existe uma formação
     * academica igual à informada, substitui a mesma no conjunto.
     * 
     * @param formacaoAcademica
     */
    public void adicionaFormacaoAcademica(
        FormacaoAcademica formacaoAcademica )
    {
        this.formacoesAcademicas.add( formacaoAcademica );
    }

    public void removeFormacaoAcademica(
        FormacaoAcademica formacaoAcademica )
    {
        this.formacoesAcademicas.remove( formacaoAcademica );
    }

    /**
     * Adiciona uma iniciacao científica ao curriculo.
     * @pre O objeto iniciacaoCientifica já DEVE ter sido salvo pelo Hibernate.
     * @param iniciacaoCientifica
     */
    public void adicionaIniciacaoCientifica(
        IniciacaoCientifica iniciacaoCientifica )
    {
        this.iniciacoesCientificas.add( iniciacaoCientifica );

    }

    public void removeIniciacaoCientifica(
        IniciacaoCientifica iniciacaoCientifica )
    {
        this.iniciacoesCientificas.remove( iniciacaoCientifica );

    }

    public void adicionaBolsa(
        Bolsa bolsa )
    {
        this.bolsas.add( bolsa );
    }

    public void removeBolsa(
        Bolsa bolsa )
    {
        this.bolsas.remove( bolsa );
    }

    public byte[] getArquivoHistoricoPDF()
    {
        return arquivoHistoricoPDF;
    }

    public void setArquivoHistoricoPDF(
        byte[] arquivoHistoricoPDF )
    {
        this.arquivoHistoricoPDF = arquivoHistoricoPDF;
    }

    public byte[] getArquivoDiplomaPDF()
    {
        return arquivoDiplomaPDF;
    }

    public void setArquivoDiplomaPDF(
        byte[] arquivoDiplomaPDF )
    {
        this.arquivoDiplomaPDF = arquivoDiplomaPDF;
    }
    
    public byte[] getArquivoDiplomaMestradoPDF()
    {
        return arquivoDiplomaMestradoPDF;
    }
    
    public void setArquivoDiplomaMestradoPDF(
        byte[] arquivoDiplomaMestradoPDF )
    {
        this.arquivoDiplomaMestradoPDF = arquivoDiplomaMestradoPDF;
    }
    
    public byte[] getArquivoHistoricoMestradoPDF()
    {
        return arquivoHistoricoMestradoPDF;
    }
    
    public void setArquivoHistoricoMestradoPDF(
        byte[] arquivoHistoricoMestradoPDF )
    {
        this.arquivoHistoricoMestradoPDF = arquivoHistoricoMestradoPDF;
    }

    public byte[] getArquivoPoscompPDF()
    {
        return arquivoPoscompPDF;
    }

    public void setArquivoPoscompPDF(
        byte[] arquivoPoscompPDF )
    {
        this.arquivoPoscompPDF = arquivoPoscompPDF;
    }

    public String getNomeArquivoDiploma()
    {
        return nomeArquivoDiploma;
    }

    public void setNomeArquivoDiploma(
        String nomeArquivoDiploma )
    {
        this.nomeArquivoDiploma = nomeArquivoDiploma;
    }

    public String getNomeArquivoHistorico()
    {
        return nomeArquivoHistorico;
    }

    public void setNomeArquivoHistorico(
        String nomeArquivoHistorico )
    {
        this.nomeArquivoHistorico = nomeArquivoHistorico;
    }

    public String getNomeArquivoPoscomp()
    {
        return nomeArquivoPoscomp;
    }

    public void setNomeArquivoPoscomp(
        String nomeArquivoPoscomp )
    {
        this.nomeArquivoPoscomp = nomeArquivoPoscomp;
    }

    public String getExperienciaProfissional()
    {
        return experienciaProfissional;
    }

    public void setExperienciaProfissional(
        String experienciaProfissional )
    {
        this.experienciaProfissional = experienciaProfissional;
    }

    public String getAtividadesAtuais()
    {
        return atividadesAtuais;
    }

    public void setAtividadesAtuais(
        String atividadesAtuais )
    {
        this.atividadesAtuais = atividadesAtuais;
    }

    public String getResumoMestrado()
    {
        return resumoMestrado;
    }

    public Set<DisciplinaEspecial> getDisciplinasEspeciais()
    {
        return disciplinasEspeciais;
    }

    public void setDisciplinasEspeciais(
        Set<DisciplinaEspecial> disciplinasEspeciais )
    {
        this.disciplinasEspeciais = disciplinasEspeciais;
    }

    public void setResumoMestrado(
        String resumoMestrado )
    {
        this.resumoMestrado = resumoMestrado;
    }

    public void adicionaDisciplinaEspecial(
        DisciplinaEspecial disciplinaEspecial )
    {
        disciplinasEspeciais.add( disciplinaEspecial );
    }

    public void removeDisciplinaEspecial(
        DisciplinaEspecial disciplinaEspecial )
    {
        disciplinasEspeciais.remove( disciplinaEspecial );
    }

}
